diff options
| author | Sebastien Castiel <sebastien@castiel.me> | 2023-12-19 09:44:09 -0500 |
|---|---|---|
| committer | Sebastien Castiel <sebastien@castiel.me> | 2023-12-19 09:44:09 -0500 |
| commit | f881aff5f9993c3a6b4b0d8ed7e67d2f812f39d6 (patch) | |
| tree | 685731e70ad838dbc2b3d70450e090e1e5fc31c9 /src/app/groups/[groupId]/expenses | |
| parent | 1e66efe5169dfad9a0c62ba42fbf31ce977bf49e (diff) | |
Revert "Use modal dialogs for expense creation & edition (#10)"
This reverts commit 1e66efe5169dfad9a0c62ba42fbf31ce977bf49e.
Diffstat (limited to 'src/app/groups/[groupId]/expenses')
| -rw-r--r-- | src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx | 42 | ||||
| -rw-r--r-- | src/app/groups/[groupId]/expenses/actions.ts | 28 | ||||
| -rw-r--r-- | src/app/groups/[groupId]/expenses/create/page.tsx | 27 | ||||
| -rw-r--r-- | src/app/groups/[groupId]/expenses/expense-list.tsx | 9 | ||||
| -rw-r--r-- | src/app/groups/[groupId]/expenses/expense-page.tsx | 19 | ||||
| -rw-r--r-- | src/app/groups/[groupId]/expenses/layout.tsx | 9 | ||||
| -rw-r--r-- | src/app/groups/[groupId]/expenses/page.tsx | 2 |
7 files changed, 72 insertions, 64 deletions
diff --git a/src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx b/src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx new file mode 100644 index 0000000..188d08f --- /dev/null +++ b/src/app/groups/[groupId]/expenses/[expenseId]/edit/page.tsx @@ -0,0 +1,42 @@ +import { ExpenseForm } from '@/components/expense-form' +import { deleteExpense, getExpense, getGroup, updateExpense } from '@/lib/api' +import { expenseFormSchema } from '@/lib/schemas' +import { Metadata } from 'next' +import { notFound, redirect } from 'next/navigation' + +export const metadata: Metadata = { + title: 'Edit expense', +} + +export default async function EditExpensePage({ + params: { groupId, expenseId }, +}: { + params: { groupId: string; expenseId: string } +}) { + const group = await getGroup(groupId) + if (!group) notFound() + const expense = await getExpense(groupId, expenseId) + if (!expense) notFound() + + async function updateExpenseAction(values: unknown) { + 'use server' + const expenseFormValues = expenseFormSchema.parse(values) + await updateExpense(groupId, expenseId, expenseFormValues) + redirect(`/groups/${groupId}`) + } + + async function deleteExpenseAction() { + 'use server' + await deleteExpense(expenseId) + redirect(`/groups/${groupId}`) + } + + return ( + <ExpenseForm + group={group} + expense={expense} + onSubmit={updateExpenseAction} + onDelete={deleteExpenseAction} + /> + ) +} diff --git a/src/app/groups/[groupId]/expenses/actions.ts b/src/app/groups/[groupId]/expenses/actions.ts deleted file mode 100644 index 31bb2e7..0000000 --- a/src/app/groups/[groupId]/expenses/actions.ts +++ /dev/null @@ -1,28 +0,0 @@ -'use server' -import { createExpense, deleteExpense, updateExpense } from '@/lib/api' -import { expenseFormSchema } from '@/lib/schemas' -import { revalidatePath } from 'next/cache' - -export async function createExpenseAction(groupId: string, values: unknown) { - 'use server' - const expenseFormValues = expenseFormSchema.parse(values) - await createExpense(expenseFormValues, groupId) - revalidatePath(`/groups/${groupId}`, 'layout') -} - -export async function updateExpenseAction( - groupId: string, - expenseId: string, - values: unknown, -) { - 'use server' - const expenseFormValues = expenseFormSchema.parse(values) - await updateExpense(groupId, expenseId, expenseFormValues) - revalidatePath(`/groups/${groupId}`, 'layout') -} - -export async function deleteExpenseAction(groupId: string, expenseId: string) { - 'use server' - await deleteExpense(expenseId) - revalidatePath(`/groups/${groupId}`, 'layout') -} diff --git a/src/app/groups/[groupId]/expenses/create/page.tsx b/src/app/groups/[groupId]/expenses/create/page.tsx new file mode 100644 index 0000000..e603e59 --- /dev/null +++ b/src/app/groups/[groupId]/expenses/create/page.tsx @@ -0,0 +1,27 @@ +import { ExpenseForm } from '@/components/expense-form' +import { createExpense, getGroup } from '@/lib/api' +import { expenseFormSchema } from '@/lib/schemas' +import { Metadata } from 'next' +import { notFound, redirect } from 'next/navigation' + +export const metadata: Metadata = { + title: 'Create expense', +} + +export default async function ExpensePage({ + params: { groupId }, +}: { + params: { groupId: string } +}) { + const group = await getGroup(groupId) + if (!group) notFound() + + async function createExpenseAction(values: unknown) { + 'use server' + const expenseFormValues = expenseFormSchema.parse(values) + await createExpense(expenseFormValues, groupId) + redirect(`/groups/${groupId}`) + } + + return <ExpenseForm group={group} onSubmit={createExpenseAction} /> +} diff --git a/src/app/groups/[groupId]/expenses/expense-list.tsx b/src/app/groups/[groupId]/expenses/expense-list.tsx index adc6e7a..798a5f8 100644 --- a/src/app/groups/[groupId]/expenses/expense-list.tsx +++ b/src/app/groups/[groupId]/expenses/expense-list.tsx @@ -33,9 +33,7 @@ export function ExpenseList({ expense.isReimbursement && 'italic', )} onClick={() => { - router.push(`/groups/${groupId}/expenses/${expense.id}/edit`, { - scroll: false, - }) + router.push(`/groups/${groupId}/expenses/${expense.id}/edit`) }} > <div> @@ -68,10 +66,7 @@ export function ExpenseList({ {currency} {(expense.amount / 100).toFixed(2)} </div> <Button size="icon" variant="link" className="-my-2" asChild> - <Link - href={`/groups/${groupId}/expenses/${expense.id}/edit`} - scroll={false} - > + <Link href={`/groups/${groupId}/expenses/${expense.id}/edit`}> <ChevronRight className="w-4 h-4" /> </Link> </Button> diff --git a/src/app/groups/[groupId]/expenses/expense-page.tsx b/src/app/groups/[groupId]/expenses/expense-page.tsx deleted file mode 100644 index 281c38b..0000000 --- a/src/app/groups/[groupId]/expenses/expense-page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' -import { ReactNode } from 'react' - -export function ExpensePage({ - children, - title, -}: { - children: ReactNode - title: ReactNode -}) { - return ( - <Card> - <CardHeader> - <CardTitle>{title}</CardTitle> - </CardHeader> - <CardContent>{children}</CardContent> - </Card> - ) -} diff --git a/src/app/groups/[groupId]/expenses/layout.tsx b/src/app/groups/[groupId]/expenses/layout.tsx deleted file mode 100644 index cd65df9..0000000 --- a/src/app/groups/[groupId]/expenses/layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { ReactNode } from 'react' - -export default function GroupExpensesLayout({ - children, -}: { - children: ReactNode -}) { - return <>{children}</> -} diff --git a/src/app/groups/[groupId]/expenses/page.tsx b/src/app/groups/[groupId]/expenses/page.tsx index 64987a3..5285cb8 100644 --- a/src/app/groups/[groupId]/expenses/page.tsx +++ b/src/app/groups/[groupId]/expenses/page.tsx @@ -35,7 +35,7 @@ export default async function GroupExpensesPage({ </CardHeader> <CardHeader> <Button asChild size="icon"> - <Link href={`/groups/${groupId}/expenses/create`} scroll={false}> + <Link href={`/groups/${groupId}/expenses/create`}> <Plus /> </Link> </Button> |
